from django.shortcuts import render
from django.views import View
from goods.models import SKU
from django.core.paginator import Paginator
from django.http import JsonResponse
from goods.utils import get_breadcrumb
from haystack.views import SearchView   # 导入haystack使用ES搜索引擎


class ListView(View):
    """ 商品列表信息返回 """

    def get(self, request, category_id):
        # 1、提取参数
        page = request.GET.get("page")
        page_size = request.GET.get("page_size")
        ordering = request.GET.get("ordering", "-create_time")

        # 2、校验参数
        # 3、业务数据处理 —— 根据分类过滤sku商品，排序分页返回
        # 3.1、过滤加排序
        skus = SKU.objects.filter(category_id=category_id, is_launched=True).order_by(ordering)
        # 3.2、分页
        try:
            # TODO: 使用Django的分页器实现分页
            # (1)、获取分页器对象
            paginator = Paginator(skus, page_size)  # Paginator：第一个参数是被分页的查询集；第二个参数是每页几个划分
            # (2)、找对象的方法获取所需的页数据
            page_skus = paginator.page(page)  # page_skus是一个查询集，是分页之后取得的当前页数据查询集
        except Exception as e:
            return JsonResponse({'code': 400, 'errmsg': '页面不存在'})

        # 4、构建响应
        data_list = []
        for sku in page_skus:
            data_list.append({
                'id': sku.id,
                'default_image_url': sku.default_image.url,  # 完整的图片链接
                'name': sku.name,
                'price': sku.price,
            })
        # TODO: 封装函数来获取
        breadcrumb = get_breadcrumb(category_id)
        # 分页器对象中属性num_pages，总页数
        total_page = paginator.num_pages
        return JsonResponse({
            'code': 0,
            'errmsg': '商品列表信息获取成功',
            'list': data_list,
            'count': total_page,
            'breadcrumb': breadcrumb,
        })


class HotGoodsView(View):
    """商品热销排行"""

    def get(self, request, category_id):
        """提供商品热销排行 JSON 数据"""
        # 根据销量倒序
        try:
            skus = SKU.objects.filter(category_id=category_id, is_launched=True).order_by('-sales')
            # 准备热销商品数量2个
            hot_skus_list = skus[0:2]  # 下标0和1这两条数据
        except Exception as e:
            return JsonResponse({'code': 400, 'errmsg': '获取商品出错'})
        hot_skus = []
        for sku in hot_skus_list:
            hot_skus.append({
                'id': sku.id,
                'default_image_url': sku.default_image.url,
                'name': sku.name,
                'price': sku.price
            })
        return JsonResponse({'code': 0, 'errmsg': '获取热销成功', 'hot_skus': hot_skus})


class MySearchView(SearchView):
    """商品搜索"""
    """重写 SearchView 类，构造一个 JsonResponse 响应返回"""

    def create_response(self):
        # 获取搜索结果
        # self.get_context()函数获取检索结果
        context = self.get_context()
        # context['query']用户搜索的关键词
        # context['paginator']分页器对象
        # context['paginator'].count搜索数量
        # context['paginator'].num_pages总页数
        # context['page']是一个Page对象封装了当前页结果
        # context['page'].number第几页
        # context['page'].object_list是一个列表，保存搜索的结果(每个结果是SearchResult对象)
        # SearchResult对象里面有一个object属性，就是我们需要的SKU对象。

        # 列表里面存放的是每一个搜索的结果即SKU数据
        data_list = []
        for sku in context['page'].object_list:
            data_list.append({
                'id': sku.object.id,
                'name': sku.object.name,
                'price': sku.object.price,
                'default_image_url': sku.object.default_image.url,
                'searchkey': context.get('query'),
                'page_size': context['page'].paginator.num_pages,   # 总页数
                'count': context['page'].paginator.count    # 总数量
            })
        # 拼接参数, 返回
        return JsonResponse(data_list, safe=False)

